<?php

namespace core;

// request请求类

class Request
{
    // 存储请求参数（GET/POST/PATH）
    protected $params = [];
    // 请求方法（GET/POST/PUT/DELETE 等）
    protected $method;
    // 请求路径（如/user/123）
    protected $path;
    // 请求头信息
    protected $headers = [];
    // 上传文件信息
    protected $files = [];

    public function __construct()
    {
        // 初始化请求方法和路径
        $this->initMethod();
        $this->initPath();
        // 初始化参数（GET/POST/PATH）
        $this->initParams();
        // 初始化请求头
        $this->initHeaders();
        // 初始化上传文件
        $this->initFiles();
    }

    // 初始化请求方法（处理 PUT/DELETE 等隐藏方法）
    protected function initMethod()
    {
        $method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
        // 处理隐藏方法（如 PUT/DELETE 通过 _method 参数模拟）
        if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['_method'])){
            $method = strtoupper($_POST['_method']);
        }
        $this->method = strtoupper($method);

        // echo "<pre>";
        // var_dump($_SERVER);
        // exit;
    }

    // 初始化请求路径（去除 QUERY_STRING）
    protected function initPath(){
        $this->path = parse_url($_SERVER['REQUEST_URI'] ?? '',PHP_URL_PATH);
        $this->path = trim($this->path, '/') ?: '/';
    }

    // 初始化参数（GET/POST/PATH）
    protected function initParams(){
        // 合并GET 和 POST 参数
        $this->params = array_merge($_GET,$_POST);
        
        // 若路由中有路径参数（如 /user/{id}），需在此处注入（示例）
        // 假设路由匹配后，路径参数为 ['id' => 123]，则合并到 $this->params
        // $this->params = array_merge($this->params, $routeParams);
    }

    // 初始化请求头（兼容不同服务器环境）
    protected function initHeaders(){
        if(function_exists('getallheaders')){
            $this->headers = getallheaders();
        }else{
            // 兼容 Nginx/Apache 以外的环境
            foreach($_SERVER as $key => $value){
                if(strpos($key,'HTTP_') === 0){
                    $headerkey = str_replace(' ','-',ucwords(str_replace('_', '', substr($key,5))));
                    $this->headers[$headerkey] = $value;
                }
            }
             // 单独处理 CONTENT_TYPE 和 CONTENT_LENGTH
             if(isset($_SERVER['CONTENT_TYPE'])){
                $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE'];
             };
             if (isset($_SERVER['CONTENT_LENGTH'])) {
                $this->headers['Content-Length'] = $_SERVER['CONTENT_LENGTH'];
            }
        }
    }

    // 初始化上传文件（直接读取 $_FILES）
    protected function initFiles() {
        $this->files = $_FILES;
    }

    // 获取 GET 参数（支持单个或多个）
    public function get($key = null, $default = null){
        if($key === null){
            return $this->params;
        }
        return $this->params[$key] ?? $default;
    }

    // 获取 POST 参数
    public function post($key = null, $default = null) {
        if ($key === null) {
            return $_POST;
        }
        return $_POST[$key] ?? $default;
    }

      // 获取 PATH 参数（如 /user/123 中的 123）
    public function path($key = null, $default = null) {
        // 假设路由已将路径参数注入到 $this->params（示例）
        // 实际需根据路由匹配结果动态填充
        $pathParams = []; 
        if ($key === null) {
            return $pathParams;
        }
        return $pathParams[$key] ?? $default;
    }

    // 获取合并后的请求参数（GET + POST + PATH）
    public function param($key = null, $default = null) {
        if ($key === null) {
            return $this->params;
        }
        return $this->params[$key] ?? $default;
    }

    // 判断请求方法
    public function isMethod($method) {
        return $this->method === strtoupper($method);
    }

    // 快捷判断 GET/POST/PUT/DELETE
    public function isGet() { return $this->isMethod('GET');}
    public function isPost() { return $this->isMethod('POST');}
    public function isPut() { return $this->isMethod('PUT');}
    public function isDelete() { return $this->isMethod('DELETE');}
    public function isAjax(){
        return isset($this->headers['X-Requested-With']) && $this->headers['X-Requested-With'] === 'XMLHttpRequest';
    }

    // 获取 COOKIE 值
    public function cookie($key = null, $default = null){
        if($key === null){
            return $_COOKIE;
        }
        return $_COOKIE[$key] ?? $default;
    }

    // 获取请求头值
    public function header($key = null) {
        if ($key === null) {
            return $this->headers;
        }
        return $this->headers[$key] ?? null;
    }

    // 获取上传文件（支持单个或多个）
    public function file($key = null) {
        if ($key === null) {
            return $this->files;
        }
        return $this->files[$key] ?? null;
    }

    // 获取原始输入流（适用于 PUT/DELETE 等方法的 JSON 数据）
    public function input($key = null, $default = null){
        $input = file_get_contents('php://input');
        if($input === ''){
            return $default;
        }
        $data = json_decode($input,true);
        return is_array($data) ? ($key ? ($data[$key] ?? $default) : $data) : $input;
    }

    // 获取完整 URL
    public function url(){
        $scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
        $host = $_SERVER['HTTP_HOST'] ?? '';
        return $scheme . '://' . $host . '/'. $this->path;
    }

    // 获取域名
    public function domain(){
       $scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
        $host = $_SERVER['HTTP_HOST'] ?? '';
        return $scheme . '://' . $host;
    }
}